﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>热词 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 热词 function creates, modifies, enables, or disables a 热词 while the script is running." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>热词</h1>

<p>在脚本运行时创建, 修改, 启用或禁用<a href="../Hotstrings.htm">热字串</a>.</p>

<pre class="Syntax"><span class="func">热词</span> 字符串 <span class="optional">, Replacement, OnOffToggle</span>
<span class="func">热词</span> <a href="#NewOptions">NewOptions</a>
OldValue := <span class="func">热词</span>("<a href="#EndChars">EndChars</a>" <span class="optional">, NewValue</span>)
OldValue := <span class="func">热词</span>("<a href="#MouseReset">MouseReset</a>" <span class="optional">, NewValue</span>)
<span class="func">热词</span> "Reset"
</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>字符串</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>热字串的触发字符串, 前面是<a href="../Hotstrings.htm">常用的冒号对</a>和<a href="../Hotstrings.htm#Options">选项字符</a>. 例如, <code>"::btw"</code> 或 <code>":*:]d"</code>.</p>
    <p><em>字符串</em> 可以考虑通过<a href="../Hotstrings.htm#C">区分大小写(C)</a>, <a href="../Hotstrings.htm#Question">单词敏感性(?)</a>, 激活条件(如 <a href="_HotIf.htm">#动态判断</a> 或 <a href="HotIf.htm">动态判断</a> 设置) 和触发字符串来匹配现有的热字符串. 例如, <code>"::btw"</code> 和 <code>"::BTW"</code> 只有在区分大小写模式作为默认值开启时才匹配, 而 <code>":C:btw"</code> 和 <code>":C:BTW"</code> 永远不匹配. <code>C</code> 和 <code>?</code> 选项可能包含在 <em>字符串</em> 中或者通过 <a href="_Hotstring.htm">#Hotstring</a> 指令或之前对<a href="#NewOptions">此函数</a>的调用设为默认值.</p>
    <p>如果热字串已经存在, 那么在 <em>字符串</em> 中指定的所有选项都会生效, 而其他所有选项都保持原样. 但是, 由于带有 <code>C</code> 或 <code>?</code> 的热字串被认为是与其他热字串不一样的, 所以不可能添加或删除这些选项. 作为代替, 关闭现有热字串并创建一个新的.</p>
    <p>当热字串第一次被创建时 -- 无论是通过热字串函数还是脚本中的<a href="../Hotstrings.htm">双冒号语法</a> -- 其触发字符串和选项字符序列都将成为热字串的固定名称, 正如 <a href="../Hotkeys.htm#HotBraces">ThisHotkey</a> 中显示的名称. 即使热字串函数稍后使用不同的选项字符访问热字串, 这个名称也不会改变.</p>
    <p>如果 <a href="../Hotstrings.htm#X">X(执行) 选项</a>存在于 <em>字符串</em> 中(不只是设置为默认值), <em>Replacement</em> 参数将被解释为函数名而不是替换文本. 如果 <em>Replacement</em> 是对象, 则没有效果.</p>
  </dd>

  <dt>Replacement</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Concepts.htm#objects">对象</a></p>
    <p>当热字串触发时, 替换字符串, 或调用的<a href="../Functions.htm">函数</a>或<a href="../objects/Functor.htm">函数对象</a>(作为新<a href="../misc/Threads.htm">线程</a>).</p>
    <p>默认情况下, 所有字符串都作为替换文本处理. 要按名称指定函数, 请在 <em>字符串</em> 中包含 <a href="../Hotstrings.htm#X">X(执行)</a> 选项. 请注意, 在重新指定热字符串函数后, 只有在<a href="../Hotstrings.htm#Function">给定名称</a>的情况下, 才能恢复其原来的函数.</p>
    <p>如果热字串已经存在, 则该参数可以留空, 在这种情况下, 它的替换不会被改变. 这对于只更改热字串的选项, 或打开或关闭热字串它是有用的.</p>
    <p class="note"><strong>注意</strong>: 如果指定了这个参数, 但是由于之前使用此函数而禁用了热字串, 那么热字串将继续禁用. 为了避免这种情况, 请在   <em>OnOffToggle</em> 中包含单词 <code>"On"</code>.</p>
  </dd>

  <dt>OnOffToggle</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Concepts.htm#numbers">整数</a></p>
    <p>下列值之一:</p>
    <p><strong>On</strong> 或 <strong>1</strong>(true): 启用热字串.</p>
    <p><strong>Off</strong> 或 <strong>0</strong>(false): 禁用热字串.</p>
    <p><strong>Toggle</strong> 或 <strong>-1</strong>: 设置热字串到相反的状态(启用或禁用).</p>
  </dd>

</dl>

<h2 id="Errors">错误</h2>
<p>如果参数无效或内存分配失败, 则函数抛出异常.</p>
<p>如果省略了 <em>Replacement</em> 并且 <em>字符串</em> 有效但无法匹配到一个存在的热字串, 则也会抛出异常. 这可以用来测试热字串的存在. 例如:</p>
<pre>try
    热词 "::btw"
捕获
    信息框 "The 热词 does not exist or it has no variant 遍历 the current IfWin criteria."</pre>

<h2 id="Remarks">备注</h2>
<p><a href="HotIf.htm">当前 动态判断 设置</a>决定了哪一个热字串函数的<a href="#variant">变体</a>将会运行.</p>
<p>如果该脚本被<a href="Suspend.htm">挂起</a>, 新添加/启用的热字串也将挂起, 直到挂起关闭(<a href="Suspend.htm">挂起</a> 页面中所描述的豁免除外).</p>
<p>如果此函数所做的更改有需要, 将安装或删除<a href="_InstallKeybdHook.htm">键盘</a>和/或<a href="_InstallMouseHook.htm">鼠标</a>钩子.</p>
<p>此函数不能直接启用或禁用本身以外的脚本中的热字串.</p>
<p>一旦脚本具有至少一个热字符串, 它将成为持续运行脚本, 这意味着应该使用 <a href="ExitApp.htm">退出应用</a> 而不是 退出 来退出(终止) 脚本. 除非指定了 <code>#单例模式 Off</code>, 否则热字串脚本也会自动执行 <a href="_SingleInstance.htm">#单例模式</a>.</p>

<h2 id="variant">变体(副本) 热字串</h2>
<p>一个特定的热字符串可以创建多次, 如果每个定义具有不同的 <a href="HotIf.htm">动态判断</a> 条件, <a href="../Hotstrings.htm#C">区分大小写</a>(<code>C</code> vs. <code>C0</code>/<code>C1</code>), 或<a href="../Hotstrings.htm#Question">单词敏感性</a>(<code>?</code>). 这些被称为 <em>热字串变体</em>. 例如:</p>
<pre>动态判断窗口激活 "ahk_group CarForums"
热词 "::btw", "behind the wheel"
动态判断窗口激活 "Inter-Office Chat"
热词 "::btw", "back to work"
动态判断窗口激活
热词 "::btw", "by the way"</pre>
<p>如果一个热字串的多个变体能被触发, 那么只有最早创建的将会触发.</p>
<p>有关 IfWin 的更多信息, 请参阅 <a href="_HotIf.htm#general-remarks">#_HotIf 的备注</a>.</p>

<h2 id="EndChars">EndChars</h2>
<pre class="Syntax">OldValue := <span class="func">热词</span>("EndChars" <span class="optional">, NewValue</span>)</pre>
<p>检索或修改由热字串识别器用作<a href="../Hotstrings.htm#EndChars">终止符</a>的字符集. 例如:</p>
<pre>prev_chars := 热词("EndChars", "-()[]{}':;`"/\,.?!`n `t")
信息框 "The previous value was: " prev_chars</pre>
<p><a href="Hotstring.htm#EndChars">#Hotstring EndChars</a> 也会影响这个设置.</p>
<p>目前不能为每个热字串指定不同的终止符字符集.</p>

<h2 id="MouseReset">MouseReset</h2>
<pre class="Syntax">OldValue := <span class="func">热词</span>("MouseReset" <span class="optional">, NewValue</span>)</pre>
<p>检索或修改全局设置, 该设置控制鼠标单击是否重置热字串识别器, 如<a href="../Hotstrings.htm#NoMouse">这里</a>所描述的那样. <em>NewValue</em> 为 1(true), 以启用鼠标点击检测和重置热字串识别器, 或者 0(false) 来禁用. 返回值是在调用函数之前生效的设置.</p>
<p>如果此函数所做的更改有需要, 将安装或删除<a href="_InstallMouseHook.htm">鼠标</a>钩子.</p>
<p><a href="_Hotstring.htm">#Hotstring NoMouse</a> 也会影响此设置, 等同于将 <em>NewValue</em> 指定为 <code>false</code>.</p>

<h2 id="Reset">Reset</h2>
<pre class="Syntax"><span class="func">热词</span> "Reset"</pre>
<p>立即重置热字串识别器. 换句话说, 脚本将开始等待一个全新热字串, 不再考虑之前键入的任何内容.</p>

<h2 id="NewOptions">设置默认选项</h2>
<pre class="Syntax"><span class="func">热词</span> NewOptions</pre>
<p>要为随后创建的热字串设置新的默认选项, 请将选项传递给热字串函数, 而不使用任何前导或尾随冒号. 例如: <code>热词 "T"</code>.</p>
<p>启用<a href="../Hotstrings.htm#C">大小写敏感(C)</a> 或<a href="../Hotstrings.htm#Question">单词敏感性(?)</a> 也会影响后续调用 热词 函数时将找到哪些现有的热字串. 例如, 默认情况下, <code>热词 ":T:btw"</code> 将会匹配 <code>::BTW</code>, 但是如果 <code>热词 "C"</code> 或 <code><a href="_Hotstring.htm">#Hotstring</a> C</code> 生效, 则不会. 这可以通过传递互斥的选项来撤销或覆盖; 例如, <code>C0</code> 和 <code>C1</code> 将覆盖 <code>C</code>.</p>

<h2 id="Related">相关</h2>
<p><a href="../Hotstrings.htm">热字串</a>, <a href="_HotIf.htm">#动态判断</a>, <a href="../Variables.htm#ThisHotkey">内_此热键</a>, <a href="_MaxThreadsPerHotkey.htm">#单热键最大线程数</a>, <a href="Suspend.htm">挂起</a>, <a href="../misc/Threads.htm">线程</a>, <a href="Thread.htm">线程</a>, <a href="Critical.htm">霸体</a></p>

<h2 id="Examples">示例</h2>

<div class="ex" id="ExHelper">
<p><a href="#ExHelper">#1</a>: 热字串助手. 如果您是一个热字串重度用户, 下面的脚本可能会很有用. 它基于 Andreas Borutta 创建的 v1 脚本. 通过按下 <kbd>Win</kbd>+<kbd>H</kbd>(或您选择的其他热键), 可以将当前选定的文本转换为热字串. 例如, 如果您在文字处理软件中选择了 &quot;by the way&quot;, 按下 <kbd>Win</kbd>+<kbd>H</kbd> 会提示您输入其缩写(例如 btw), 然后将新热字串添加到脚本中并启用它.</p>
<pre>#h::  <em>; Win+H 热键</em>
{
    <em> 获取当前选择的文本. 使用剪贴板代替
    ; 获取编辑框选中文本 是因为它可以工作于更大范围的编辑器
    ; (即文字处理软件).  保存剪贴板当前的内容
    ; 以便在后面恢复. 尽管只能处理纯文本,
    ; 但总比没有好:</em>
    ClipboardOld := 内_剪贴板
    内_剪贴板 := "" <em>; 必须清空, 才能检测是否有效.</em>
    发送 "^c"
    如果 !监听剪贴板(1)  <em>; 监听剪贴板 超时.</em>
    {
        内_剪贴板 := ClipboardOld <em>; 恢复剪贴板之前的内容.</em>
        返回
    }

    <em>; 替换 CRLF 和/或 LF 为 `n 以便用于 "发送-raw" 热字串:
    ; 对其他任何在原始模式下可能出现问题
    ; 的字符进行相同的处理:</em>
    ClipContent := 字符串替换(内_剪贴板, "``", "````")  <em>; 首先进行此替换以避免和后面的操作冲突.</em>
    ClipContent := 字符串替换(ClipContent, "`r`n", "``r")  <em>; 在 MS Word 等软件中中使用 `r 会比 `n 工作的更好.</em>
    ClipContent := 字符串替换(ClipContent, "`n", "``r")
    ClipContent := 字符串替换(ClipContent, "`t", "``t")
    ClipContent := 字符串替换(ClipContent, "`;", "```;")
    内_剪贴板 := ClipboardOld  <em>; 恢复剪贴板之前的内容.</em>
    ShowInputBox(":T:`::" ClipContent)
}

ShowInputBox(DefaultValue)
{
    <em>; 这里会移动 输入框 的光标到更人性化的位置:</em>
    设置定时器 "MoveCaret", 10
    <em>; 显示 输入框, 提供默认的热字串:</em>
    IB := 输入框("
    (
    类型 your abreviation at the indicated insertion point. You can also edit the replacement text 如果 you wish.

    Example entry: :T:btw`::by the way
    )", "New Hotstring",, DefaultValue)
    如果 IB.Result = "Cancel"  <em>; 用户选择了取消.</em>
        返回

    如果 正则匹配(IB.Value, "(?P&lt;Label&gt;:.*?:(?P&lt;Abbreviation&gt;.*?))::(?P&lt;Replacement&gt;.*)", 热词)
    {
        如果 !热词.Abbreviation
            MsgText := "You didn't provide an abbreviation"
        否则 如果 !热词.Replacement
            MsgText := "You didn't provide a replacement"
        否则
        {
            热词 热词.Label, 热词.Replacement  <em>; 现在激活热字串.</em>
            附加 "`n" IB.Value, 内_脚本全路径  <em>; 保存热字串以备以后使用.</em>
        }
    }
    否则
        MsgText := "The 热词 appears to be improperly formatted"

    如果 MsgText
    {
        Result := 信息框(MsgText ". Would you like to try again?",, 4)
        如果 Result = "Yes"
            ShowInputBox(DefaultValue)
    }
    
    MoveCaret()
    {
        等待窗口 "New Hotstring"
        <em>; 否则移动 输入框 中的光标到用户输入缩写的位置.</em>
        发送 "{Home}{Right 3}"
        设置定时器, 0
    }
}</pre>
</div>

</body>
</html>